package article2.builder;

import static article2.builder.Pizza.Topping.*;

/**
 * 比如 用一个类表示包装食品外面显示的营养成分标签 这些标签中有几个域是必需的：每份的含
 * 量、每罐的含量以及每份的卡路里 还有超过20个的可选域:总脂肪量、饱和脂肪量、转
 * 化脂肪、胆固醇、纳，等等 大多数产品在某几个可选域中都会有非零的值
 *
 * 简而言之，如果类的构造器或者静态工厂中具有多个参数，设计这种类时，Builder模式就是种不错的选择，
 * 特别是当大多数参数都是可选的时候。与使用传统的重叠构造器模式相比，使用Builder模式的客户端代码将更易于都和编写，构建器也比JavaBeans更加安全。
 * @author cctv
 */
public class Demo {
    public static void main(String[] args){

        // 重叠构造器
        NutritionFactsByTct a = new NutritionFactsByTct(1,2);
        // javabeans
        NutritionFactsByJavaBeans b = new NutritionFactsByJavaBeans();
        b.setServingSize(1);
        b.setServings(2);
        // builder
        NutritionFactsByBuilder c = new NutritionFactsByBuilder.Builder(1,2).calories(3).build();


        //pizza 使用平行层次结构的 builder 时，各自嵌套在相应的类中。
        NyPizza pizza = new NyPizza.Builder(NyPizza.Size.SMALL).addTopping(SAUSAGE).addTopping(ONION).build();

        Calzone calzone = new Calzone.Builder().addTopping(HAM).sauceInside().build();
    }
}
